package Entities;

import java.io.Serializable;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Calendar;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.SequenceGenerator;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

@Entity
@NamedQueries({
    @NamedQuery(name = "todosUsuarios", query = "select u from Usuario u"),
    @NamedQuery(name = "existeUsuario", query = "select count(u) from Usuario u where u.nombreUsuario = :usr and u.activo = true ")})
public abstract class Usuario implements Serializable {

    private static final long serialVersionUID = 1L;
    //Atributos
    @SequenceGenerator(name = "seq", initialValue = 1, allocationSize = 1)
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seq")
    @Id
    private Integer id;
    @Column(nullable = false, unique = true)
    private String nombreUsuario;
    @Column(nullable = false)
    private String contrasenia;
    @Column(nullable = false)
    private String nombre;
    @Column(nullable = false)
    private String apellido;
    private Integer telefono;
    private Integer cel;
    @Temporal(value = TemporalType.DATE)
    private Calendar fechaNac;
    private String email;
    private Integer rol;
    @Column(nullable = false)
    private Integer departamento;
    @Column(nullable = false)
    private String ciudad;
    @Column(nullable = false)
    private String calle;
    @Column(nullable = false)
    private Integer numero;
    private String detalle;
    @Column(nullable = false)
    private boolean activo = true;

    //Constructores
    public Usuario() {
        super();
    }

    public Usuario(String nombreUsuario, String contrasenia, String nombre, String apellido, Integer telefono, Integer cel, Calendar fechaNac, String email, Integer rol, Integer departamento, String ciudad, String calle, Integer numero, String detalle) {
        this.nombreUsuario = nombreUsuario;
        this.contrasenia = codificarPassword(contrasenia);
        this.nombre = nombre;
        this.apellido = apellido;
        this.telefono = telefono;
        this.cel = cel;
        this.fechaNac = fechaNac;
        this.email = email;
        this.rol = rol;
        this.departamento = departamento;
        this.ciudad = ciudad;
        this.calle = calle;
        this.numero = numero;
        this.detalle = detalle;
        this.activo = true;
    }

    //Getters and Setters
    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getNombreUsuario() {
        return nombreUsuario;
    }

    public void setNombreUsuario(String nombreUsuario) {
        this.nombreUsuario = nombreUsuario;
    }

    public String getContrasenia() {
        return contrasenia;
    }

    public void setContrasenia(String contrasenia) {
        this.contrasenia = codificarPassword(contrasenia);
    }

    public String getNombre() {
        return nombre;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    public String getApellido() {
        return apellido;
    }

    public void setApellido(String apellido) {
        this.apellido = apellido;
    }

    public Integer getTelefono() {
        return telefono;
    }

    public void setTelefono(Integer telefono) {
        this.telefono = telefono;
    }

    public Integer getCel() {
        return cel;
    }

    public void setCel(Integer cel) {
        this.cel = cel;
    }

    public Calendar getFechaNac() {
        return fechaNac;
    }

    public void setFechaNac(Calendar fechaNac) {
        this.fechaNac = fechaNac;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public Integer getRol() {
        return rol;
    }

    public void setRol(Integer rol) {
        this.rol = rol;
    }

    public Integer getDepartamento() {
        return departamento;
    }

    public void setDepartamento(Integer departamento) {
        this.departamento = departamento;
    }

    public String getCiudad() {
        return ciudad;
    }

    public void setCiudad(String ciudad) {
        this.ciudad = ciudad;
    }

    public String getCalle() {
        return calle;
    }

    public void setCalle(String calle) {
        this.calle = calle;
    }

    public Integer getNumero() {
        return numero;
    }

    public void setNumero(Integer numero) {
        this.numero = numero;
    }

    public String getDetalle() {
        return detalle;
    }

    public void setDetalle(String detalle) {
        this.detalle = detalle;
    }

    public boolean getActivo() {
        return activo;
    }

    public void setActivo(boolean activo) {
        this.activo = activo;
    }

    private String toHexadecimal(byte[] digest) {
        String hash = "";
        for (byte aux : digest) {
            int b = aux & 0xff;
            if (Integer.toHexString(b).length() == 1) {
                hash += "0";
            }
            hash += Integer.toHexString(b);
        }
        return hash;
    }

    private String codificarPassword(String cadena) {
        byte[] digest = null;
        byte[] buffer = cadena.getBytes();
        try {
            MessageDigest messageDigest = MessageDigest.getInstance("SHA-256");
            messageDigest.reset();
            messageDigest.update(buffer);
            digest = messageDigest.digest();
        } catch (NoSuchAlgorithmException ex) {
        }
        return toHexadecimal(digest);
    }

    @Override
    public String toString() {
        return "Entity.Usuario[ id=" + id + " ]";
    }
}